home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / gnu / flex / flexs237.zoo / main.c < prev    next >
C/C++ Source or Header  |  1993-03-05  |  20KB  |  773 lines

  1. /* flex - tool to generate fast lexical analyzers */
  2.  
  3. /*-
  4.  * Copyright (c) 1990 The Regents of the University of California.
  5.  * All rights reserved.
  6.  *
  7.  * This code is derived from software contributed to Berkeley by
  8.  * Vern Paxson.
  9.  * 
  10.  * The United States Government has rights in this work pursuant
  11.  * to contract no. DE-AC03-76SF00098 between the United States
  12.  * Department of Energy and the University of California.
  13.  *
  14.  * Redistribution and use in source and binary forms are permitted provided
  15.  * that: (1) source distributions retain this entire copyright notice and
  16.  * comment, and (2) distributions including binaries display the following
  17.  * acknowledgement:  ``This product includes software developed by the
  18.  * University of California, Berkeley and its contributors'' in the
  19.  * documentation or other materials provided with the distribution and in
  20.  * all advertising materials mentioning features or use of this software.
  21.  * Neither the name of the University nor the names of its contributors may
  22.  * be used to endorse or promote products derived from this software without
  23.  * specific prior written permission.
  24.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
  25.  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  26.  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  27.  */
  28.  
  29. #ifndef lint
  30. char copyright[] =
  31. "@(#) Copyright (c) 1990 The Regents of the University of California.\n\
  32.  All rights reserved.\n";
  33. #endif /* not lint */
  34.  
  35. #ifndef lint
  36. static char rcsid[] =
  37.     "@(#) $Header: /usr/fsys/odin/a/vern/flex/RCS/main.c,v 2.9 90/06/27 23:48:24 vern Exp $ (LBL)";
  38. #endif
  39.  
  40.  
  41. #include "flexdef.h"
  42.  
  43. static char flex_version[] = "2.3";
  44.  
  45.  
  46. /* declare functions that have forward references */
  47.  
  48. void flexinit PROTO((int, char**));
  49. void readin PROTO(());
  50. void set_up_initial_allocations PROTO(());
  51.  
  52.  
  53. /* these globals are all defined and commented in flexdef.h */
  54. int printstats, syntaxerror, eofseen, ddebug, trace, spprdflt;
  55. int interactive, caseins, useecs, fulltbl, usemecs;
  56. int fullspd, gen_line_dirs, performance_report, backtrack_report, csize;
  57. int yymore_used, reject, real_reject, continued_action;
  58. int yymore_really_used, reject_really_used;
  59. int datapos, dataline, linenum;
  60. FILE *skelfile = NULL;
  61. char *infilename = NULL;
  62. int onestate[ONE_STACK_SIZE], onesym[ONE_STACK_SIZE];
  63. int onenext[ONE_STACK_SIZE], onedef[ONE_STACK_SIZE], onesp;
  64. int current_mns, num_rules, current_max_rules, lastnfa;
  65. int *firstst, *lastst, *finalst, *transchar, *trans1, *trans2;
  66. int *accptnum, *assoc_rule, *state_type, *rule_type, *rule_linenum;
  67. int current_state_type;
  68. int variable_trailing_context_rules;
  69. int numtemps, numprots, protprev[MSP], protnext[MSP], prottbl[MSP];
  70. int protcomst[MSP], firstprot, lastprot, protsave[PROT_SAVE_SIZE];
  71. int numecs, nextecm[CSIZE + 1], ecgroup[CSIZE + 1], nummecs, tecfwd[CSIZE + 1];
  72. int tecbck[CSIZE + 1];
  73. int *xlation = (int *) 0;
  74. int num_xlations;
  75. int lastsc, current_max_scs, *scset, *scbol, *scxclu, *sceof, *actvsc;
  76. char **scname;
  77. int current_max_dfa_size, current_max_xpairs;
  78. int current_max_template_xpairs, current_max_dfas;
  79. int lastdfa, *nxt, *chk, *tnxt;
  80. int *base, *def, *nultrans, NUL_ec, tblend, firstfree, **dss, *dfasiz;
  81. union dfaacc_union *dfaacc;
  82. int *accsiz, *dhash, numas;
  83. int numsnpairs, jambase, jamstate;
  84. int lastccl, current_maxccls, *cclmap, *ccllen, *cclng, cclreuse;
  85. int current_max_ccl_tbl_size;
  86. Char *ccltbl;
  87. char *starttime, *endtime, nmstr[MAXLINE];
  88. int sectnum, nummt, hshcol, dfaeql, numeps, eps2, num_reallocs;
  89. int tmpuses, totnst, peakpairs, numuniq, numdup, hshsave;
  90. int num_backtracking, bol_needed;
  91. FILE *temp_action_file;
  92. FILE *backtrack_file;
  93. int end_of_buffer_state;
  94. char *action_file_name = NULL;
  95. char **input_files;
  96. int num_input_files;
  97. char *program_name;
  98.  
  99. #ifndef SHORT_FILE_NAMES
  100. static char *outfile = "lex.yy.c";
  101. #else
  102. static char *outfile = "lexyy.c";
  103. #endif
  104. static int outfile_created = 0;
  105. static int use_stdout;
  106. static char *skelname = NULL;
  107. #ifdef atarist
  108. long _stksize = -1L;    /* need lots of stk+heap */
  109. #endif
  110.  
  111. int main( argc, argv )
  112. int argc;
  113. char **argv;
  114.  
  115.     {
  116.     flexinit( argc, argv );
  117.  
  118.     readin();
  119.  
  120.     if ( syntaxerror )
  121.     flexend( 1 );
  122.  
  123.     if ( yymore_really_used == REALLY_USED )
  124.     yymore_used = true;
  125.     else if ( yymore_really_used == REALLY_NOT_USED )
  126.     yymore_used = false;
  127.  
  128.     if ( reject_really_used == REALLY_USED )
  129.     reject = true;
  130.     else if ( reject_really_used == REALLY_NOT_USED )
  131.     reject = false;
  132.  
  133.     if ( performance_report )
  134.     {
  135.     if ( interactive )
  136.         fprintf( stderr,
  137.              "-I (interactive) entails a minor performance penalty\n" );
  138.  
  139.     if ( yymore_used )
  140.         fprintf( stderr, "yymore() entails a minor performance penalty\n" );
  141.  
  142.     if ( reject )
  143.         fprintf( stderr, "REJECT entails a large performance penalty\n" );
  144.  
  145.     if ( variable_trailing_context_rules )
  146.         fprintf( stderr,
  147. "Variable trailing context rules entail a large performance penalty\n" );
  148.     }
  149.  
  150.     if ( reject )
  151.     real_reject = true;
  152.  
  153.     if ( variable_trailing_context_rules )
  154.     reject = true;
  155.  
  156.     if ( (fulltbl || fullspd) && reject )
  157.     {
  158.     if ( real_reject )
  159.         flexerror( "REJECT cannot be used with -f or -F" );
  160.     else
  161.         flexerror(
  162.     "variable trailing context rules cannot be used with -f or -F" );
  163.     }
  164.  
  165.     ntod();
  166.  
  167.     /* generate the C state transition tables from the DFA */
  168.     make_tables();
  169.  
  170.     /* note, flexend does not return.  It exits with its argument as status. */
  171.  
  172.     flexend( 0 );
  173.  
  174.     /*NOTREACHED*/
  175.     }
  176.  
  177.  
  178. /* flexend - terminate flex
  179.  *
  180.  * synopsis
  181.  *    int status;
  182.  *    flexend( status );
  183.  *
  184.  *    status is exit status.
  185.  *
  186.  * note
  187.  *    This routine does not return.
  188.  */
  189.  
  190. void flexend( status )
  191. int status;
  192.  
  193.     {
  194.     int tblsiz;
  195.     char *flex_gettime();
  196.  
  197.     if ( skelfile != NULL )
  198.     {
  199.     if ( ferror( skelfile ) )
  200.         flexfatal( "error occurred when writing skeleton file" );
  201.  
  202.     else if ( fclose( skelfile ) )
  203.         flexfatal( "error occurred when closing skeleton file" );
  204.     }
  205.  
  206.     if ( temp_action_file )
  207.     {
  208.     if ( ferror( temp_action_file ) )
  209.         flexfatal( "error occurred when writing temporary action file" );
  210.  
  211.     else if ( fclose( temp_action_file ) )
  212.         flexfatal( "error occurred when closing temporary action file" );
  213.  
  214.     else if ( unlink( action_file_name ) )
  215.         flexfatal( "error occurred when deleting temporary action file" );
  216.     }
  217.  
  218.     if ( status != 0 && outfile_created )
  219.     {
  220.     if ( ferror( stdout ) )
  221.         flexfatal( "error occurred when writing output file" );
  222.  
  223.     else if ( fclose( stdout ) )
  224.         flexfatal( "error occurred when closing output file" );
  225.  
  226.     else if ( unlink( outfile ) )
  227.         flexfatal( "error occurred when deleting output file" );
  228.     }
  229.  
  230.     if ( backtrack_report && backtrack_file )
  231.     {
  232.     if ( num_backtracking == 0 )
  233.         fprintf( backtrack_file, "No backtracking.\n" );
  234.     else if ( fullspd || fulltbl )
  235.         fprintf( backtrack_file,
  236.              "%d backtracking (non-accepting) states.\n",
  237.              num_backtracking );
  238.     else
  239.         fprintf( backtrack_file, "Compressed tables always backtrack.\n" );
  240.  
  241.     if ( ferror( backtrack_file ) )
  242.         flexfatal( "error occurred when writing backtracking file" );
  243.  
  244.     else if ( fclose( backtrack_file ) )
  245.         flexfatal( "error occurred when closing backtracking file" );
  246.     }
  247.  
  248.     if ( printstats )
  249.     {
  250.     endtime = flex_gettime();
  251.  
  252.     fprintf( stderr, "%s version %s usage statistics:\n", program_name,
  253.          flex_version );
  254.     fprintf( stderr, "  started at %s, finished at %s\n",
  255.          starttime, endtime );
  256.  
  257.     fprintf( stderr, "  scanner options: -" );
  258.  
  259.     if ( backtrack_report )
  260.         putc( 'b', stderr );
  261.     if ( ddebug )
  262.         putc( 'd', stderr );
  263.     if ( interactive )
  264.         putc( 'I', stderr );
  265.     if ( caseins )
  266.         putc( 'i', stderr );
  267.     if ( ! gen_line_dirs )
  268.         putc( 'L', stderr );
  269.     if ( performance_report )
  270.         putc( 'p', stderr );
  271.     if ( spprdflt )
  272.         putc( 's', stderr );
  273.     if ( use_stdout )
  274.         putc( 't', stderr );
  275.     if ( trace )
  276.         putc( 'T', stderr );
  277.     if ( printstats )
  278.         putc( 'v', stderr );    /* always true! */
  279.     if ( csize == 256 )
  280.         putc( '8', stderr );
  281.  
  282.     fprintf( stderr, " -C" );
  283.  
  284.     if ( fulltbl )
  285.         putc( 'f', stderr );
  286.     if ( fullspd )
  287.         putc( 'F', stderr );
  288.     if ( useecs )
  289.         putc( 'e', stderr );
  290.     if ( usemecs )
  291.         putc( 'm', stderr );
  292.  
  293.     if ( strcmp( skelname